#include "PluginsManagerPrivate.h"


bool PluginsManagerPrivate::check(const QString &filePath)
{
    bool status = true;
    
    //!获取依赖列表 如果有的话
    foreach (QVariant item, m_dependencies.value(filePath)) {
        QVariantMap map =  item.toMap();
        //!依赖的插件名称，版本，路径
        QVariant name = map.value("name");
        //! FIXME: 版本检测这里 应该加一个 版本号区间（有时插件的版本不一定一致）
        //! 构思：[] 大于小于或者等于 即：1.[2,5].0 版本号 第二个版本在 2<= x <=5 都能通过
        //! {} 在范围内，不等于 如：1.[2,5].[0,3} 版本号 主版本 为1，复版本为 2<= x <=5 低版本为 0<= x <3
        //! * 所有都可以 
        QVariant version = map.value("version");
        QString path = m_name.key(name);
        
        /************ 检测插件是否依赖于其他插件 ******************/
        //! BUG: 这里会不会出现一种情况：插件在被依赖插件之前加载。
        //! 检测名称
        if(!m_name.values().contains(name)){
            qCritical()<<"Missing dependency:"<<name.toString() << "for plugin" <<path;
            status = false;
            continue;
        }
        //! 检查版本
        if(m_versions.value(filePath) != version){
            qCritical()<<"Version mismatch:"<<name.toString()<<"version"
                      <<m_versions.value(m_name.key(name)).toString()
                     << "but"<<version.toString()<<"required for plugin"
                     <<path;
            status = false;
            continue;
        }
        
        //! 最后，检测被依赖的插件是否还依赖于另外的插件
        if(!check(path)){
            qCritical()<<"Corrupted dependency:"<<name.toString()
                      <<"for plugin"<<path;
            status = false;
            continue;
        }
        
        
    }
    
    return status;
}
